package modelo;

import java.util.Observable;
import java.util.Timer;
import java.util.TimerTask;

/**
 * para el Cronometro se implementa Singleton para asegurar que 
 * no haya dos tiempos durante el juego
 */
public class Cronometro extends Observable {
	private static Cronometro INSTANCE = null;
	private static long intervalo_mS;
	private static Timer timer;
	private static boolean encendido;
	private static long tiempo;
	
	/** se actualiza cada 25 milisegundos = 40 fps **/
	public static long INTERVALO_DE_TIEMPO = 25;

	private Cronometro(){
		intervalo_mS = INTERVALO_DE_TIEMPO;
		timer = null;
		encendido = false;
		tiempo = -1;
	}
	
	private synchronized static void createInstance() {
		if (INSTANCE == null) { 
	       INSTANCE = new Cronometro();
	    }
	}

	public static Cronometro getInstance() {
	    if (INSTANCE == null) 
	    	createInstance();
	    return INSTANCE;
	}
	
	public void iniciar(){
		encendido = true;
		if (tiempo == -1){
			timer = new Timer();
			timer.scheduleAtFixedRate(notificarObservadores, intervalo_mS, intervalo_mS);	
		}
		tiempo = 0;
	}
		
	TimerTask notificarObservadores = new TimerTask(){
		public void run() {
			if(encendido){
				tiempo = tiempo + intervalo_mS;
				setChanged();
				notifyObservers();
			}
		}
	};
	
	public void pausar(){
		encendido = false;
	}
	
	public void reanudar(){
		encendido = true;
	}
	
	public boolean estaEncendido(){
		return encendido;
	}
	
	public long getTiempo(){
		return tiempo;
	}
	
	public long getTiempoEnSegundos(){
		return (long)Convertir.mX_a_X(tiempo);
	}
	
	public double getTiempoEnMinutos(){
		return (Convertir.mX_a_X(tiempo)) / 60f;
	}
}
